From a2fce95248a260d9471efbff94ad0cde7a90700d Mon Sep 17 00:00:00 2001 From: James Haggerty Date: Mon, 8 Apr 2024 02:37:42 +0000 Subject: [PATCH] luci-base: don't render until luci-loaded is done Because the setupDOM/initDOM methods do strange things related to the old lua server rendered templates (like remove all the elements currently hidden by dependencies...), we want to be sure that these have finished before the view itself renders. This also ensures that any caching (e.g. from probeSystemFeatures) is finished before the view render. This feels like a hacky fix, but it's not clear to me what the best one is. Signed-off-by: James Haggerty --- .../luci-base/htdocs/luci-static/resources/luci.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js index a1207f567c..1a5eaa296c 100644 --- a/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -1893,6 +1893,15 @@ DOM.content(vp, E('div', { 'class': 'spinning' }, _('Loading view…'))); return Promise.resolve(this.load()) + .then(function (...args) { + if (L.loaded) { + return Promise.resolve(...args); + } else { + return new Promise(function (resolve) { + document.addEventListener('luci-loaded', resolve.bind(null, ...args), { once: true }); + }); + } + }) .then(LuCI.prototype.bind(this.render, this)) .then(LuCI.prototype.bind(function(nodes) { const vp = document.getElementById('view'); @@ -2688,9 +2697,12 @@ initDOM() { originalCBIInit(); Poll.start(); + L.loaded = true; document.dispatchEvent(new CustomEvent('luci-loaded')); }, + loaded: false, + /** * The `env` object holds environment settings used by LuCI, such * as request timeouts, base URLs etc. -- 2.30.2